/**
 * 深拷贝并断开原型链
 * @param obj 要拷贝的对象
 * @param hash 用于处理循环引用的 WeakMap
 * @returns 深拷贝后的对象
 */
export function deepClone<T>(obj: T, hash = new WeakMap()): T {
    // 处理 null 或非对象类型
    if (obj === null || typeof obj !== 'object') {
        return obj;
    }

    // 处理日期对象
    if (obj instanceof Date) {
        return new Date(obj.getTime()) as any;
    }

    // 处理正则表达式
    if (obj instanceof RegExp) {
        return new RegExp(obj) as any;
    }

    // 处理 Map
    if (obj instanceof Map) {
        const map = new Map();
        Array.from(obj.entries()).forEach(([key, value]) => {
            map.set(deepClone(key, hash), deepClone(value, hash));
        });
        return map as any;
    }

    // 处理 Set
    if (obj instanceof Set) {
        const set = new Set();
        Array.from(obj.values()).forEach(value => {
            set.add(deepClone(value, hash));
        });
        return set as any;
    }

    // 检查循环引用
    if (hash.has(obj)) {
        return hash.get(obj);
    }

    // 检查是否为 Vue 组件实例
    if ('__isVue' in obj || '__v_skip' in obj) {
        // 对于 Vue 组件实例，只复制其数据属性
        const rawData = (obj as any).$data || {};
        return deepClone(rawData, hash);
    }

    // 创建新对象，使用 Object.create(null) 断开原型链
    const result = Array.isArray(obj) ? [] : Object.create(null);

    // 将当前对象加入 hash，处理循环引用
    hash.set(obj, result);

    // 使用 Object.getOwnPropertyNames 获取所有属性，包括不可枚举属性
    const props = Object.getOwnPropertyNames(obj);
    
    // 递归处理所有属性
    props.forEach(key => {
        // 跳过 Vue 相关的内部属性
        if (key.startsWith('__v_') || key === '__v') {
            return;
        }
        const descriptor = Object.getOwnPropertyDescriptor(obj, key);
        if (descriptor && descriptor.enumerable) {
            result[key] = deepClone((obj as any)[key], hash);
        }
    });

    return result;
}